package miage.gestioncabinet.corem;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.ejb.Remote;
import javax.ejb.Stateful;

import fr.vidal.webservices.interactionservice.ArrayOfInteractionCouple;
import fr.vidal.webservices.interactionservice.InteractionCouple;
import fr.vidal.webservices.interactionservice.InteractionResult;
import fr.vidal.webservices.interactionservice.InteractionService;
import fr.vidal.webservices.interactionservice.InteractionService_Service;
import fr.vidal.webservices.interactionservice.InteractionSeverityType;
import fr.vidal.webservices.productservice.ProductService;
import fr.vidal.webservices.productservice.ProductService_Service;
import miage.gestioncabinet.api.Consultation;
import miage.gestioncabinet.api.ConsultationRemoteService;
import miage.gestioncabinet.api.GestionCabinetException;
import miage.gestioncabinet.api.Produit;
import miage.gestioncabinet.api.Traitement;

@Stateful
@Remote(ConsultationRemoteService.class)
public class ConsultationRemoteServiceM implements ConsultationRemoteService{
	
	private ConsultationM consultation;

	@Override
	/**
	 * Affichage de la consultation
	 */
	public Consultation getConsultation() {
		return this.consultation;
	}

	@Override
	/**
	 * Modification de la consultation
	 * @param Consultation consultation : valeurs de la consultation à modifier
	 */
	public void setConsultation(Consultation consultation) {
		this.consultation = (ConsultationM) consultation;
	}

	@Override
	/**
	 * Création d'un rendez-vous
	 * @param Calendar date : date de début de la consultation
	 */
	public Consultation creerRdv(Calendar date) {
		ConsultationM c = new ConsultationM();
		c.setDebut(date);
		return c;
	}

	@Override
	/**
	 * Recherche de médicaments
	 * @param String keyword : mot cherché dans le nom du médicament
	 * @return liste des médicaments dont le nom contient le mot cherché
	 */
	public List<Produit> rechercherMedicament(String keyword)
			throws GestionCabinetException {
		
		ProductService_Service pss = new ProductService_Service();
		ProductService ps = pss.getProductServiceHttpPort();
		fr.vidal.webservices.productservice.ArrayOfProduct produits = ps.directSearchByName(keyword);
		
		List<fr.vidal.webservices.productservice.Product> medicaments = produits.getProduct();
		List<Produit> listMedicaments = new ArrayList<Produit> ();
		for(fr.vidal.webservices.productservice.Product product : medicaments) {
			Produit p = new ProduitM();
			p.setNom(product.getName());
			p.setCis(product.getCis());
			listMedicaments.add(p);
		}
		return listMedicaments;
	}

	@Override
	/**
	 * Affichage de la prescription
	 */
	public void analyserPrescription() throws GestionCabinetException {
		List<Produit> produits = new ArrayList<Produit>();
		for(Traitement i : this.consultation.getPrescription()){
			produits.add(i.getProduit());
		}
		
		List<fr.vidal.webservices.productservice.Product> produitsVidal = new ArrayList<fr.vidal.webservices.productservice.Product>();
		for(Produit p : produits) {
			ProductService_Service pss = new ProductService_Service();
			ProductService ps = pss.getProductServiceHttpPort();
			produitsVidal.add(ps.searchByCis(p.getCis()));
		}
		
		fr.vidal.webservices.interactionservice.ArrayOfInt idProdVidal = new fr.vidal.webservices.interactionservice.ArrayOfInt();
		List<Integer> listIdProduct = new ArrayList<Integer>();
		for(fr.vidal.webservices.productservice.Product p : produitsVidal){
			listIdProduct.add(p.getId());
		}
		
		idProdVidal = (fr.vidal.webservices.interactionservice.ArrayOfInt) listIdProduct;
		InteractionService_Service iss = new InteractionService_Service();
		InteractionService is = iss.getInteractionServiceHttpPort();
		List<InteractionResult> interactionVidal = new ArrayList<InteractionResult>();
		interactionVidal.add(is.getInteractionCouplesForProductIds(idProdVidal, InteractionSeverityType.CONTRAINDICATIONS));
		interactionVidal.add(is.getInteractionCouplesForProductIds(idProdVidal, InteractionSeverityType.DISADVISES_ASSOCIATION));
		interactionVidal.add(is.getInteractionCouplesForProductIds(idProdVidal, InteractionSeverityType.PRECAUTION_USE));
		interactionVidal.add(is.getInteractionCouplesForProductIds(idProdVidal, InteractionSeverityType.TAKE_INTO_ACCOUNT));
		
		List<ArrayOfInteractionCouple> listArrayInteractionCouple = new ArrayList<ArrayOfInteractionCouple>();
		for(InteractionResult ir : interactionVidal) {
			listArrayInteractionCouple.add(ir.getInteractionCoupleList());
		}
		
		List<InteractionCouple> listInteractionCouple = new ArrayList<InteractionCouple>();
		for(ArrayOfInteractionCouple aic : listArrayInteractionCouple) {
			listInteractionCouple.addAll(aic.getInteractionCouple());
		}
		
		List<InteractionM> listInteractions = new ArrayList<InteractionM>();
		for(InteractionCouple ic : listInteractionCouple) {
			InteractionM i = new InteractionM();
			i.setPrecautions(ic.getPrecautionComment());
			Produit pa = new ProduitM();
			pa.setCis(ic.getProductA().getCis());
			pa.setNom(ic.getProductA().getName());
			Produit pb = new ProduitM();
			pb.setCis(ic.getProductB().getCis());
			pb.setNom(ic.getProductB().getName());
			i.setProduitA(pa);
			i.setProduitB(pb);
			i.setRisques(ic.getRiskComment());
			ic.setSeverity(ic.getSeverity());
		}
		
		this.consultation.setInteraction(listInteractions);
		
		for(InteractionM i : listInteractions) {
			System.out.println(i.getPrecautions() + " " +
							   i.getRisques() + " " + 
							   i.getSeverite() + " " +
							   i.getProduitA() + " " +
							   i.getProduitB());
		}
	}

	@Override
	/**
	 * Enregistrement de la consultation
	 */
	public Consultation enregistrer() throws GestionCabinetException {
		return null;
	}

	@Override
	/**
	 * Suppression de la consultation
	 */
	public void supprimer() throws GestionCabinetException {
		this.consultation = null;
	}

}
